package org.jeecgframework.core.common.dao.impl;

import org.jeecgframework.core.common.dao.IBaseDao;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

@Service
public class BaseDao implements IBaseDao {

    @Resource
    JdbcTemplate jdbcTemplate;

    /**
     * 执行 INSERT,UPDATE,DELETE
     */
    @Transactional
    public int executeNativeSql(String sql, Object... params) {
        try {
            return jdbcTemplate.update(sql, params);
        } catch (DataAccessException ex) {
            ex.printStackTrace();
            return 0;
        }
    }

    /**
     * 测试批量更新操作
     * 最后一个参数是 Object[] 的 List 类型：因为修改一条记录需要一个 Object 数组，修改多条记录就需要一个 List 来存放多个数组。
     */
    @Transactional
    public int[] batchNativeSql(String sql, List<Object[]> params) {
//    String sql = "INSERT INTO employees(last_name, email, dept_id) VALUES(?,?,?)";
//    List<Object[]> batchArgs = new ArrayList<>();
//    batchArgs.add(new Object[]{"AA", "aa@atguigu.com", 1});
//    batchArgs.add(new Object[]{"BB", "bb@atguigu.com", 2});
//    batchArgs.add(new Object[]{"CC", "cc@atguigu.com", 3});
//    batchArgs.add(new Object[]{"DD", "dd@atguigu.com", 3});
//    batchArgs.add(new Object[]{"EE", "ee@atguigu.com", 2});
        return jdbcTemplate.batchUpdate(sql, params);
    }

    /**
     * 查询单个值，如果返回多行或无数据返回，则使用默认值
     *
     * @param sql
     * @param params
     * @param objClass
     * @param <T>
     * @return
     */
    @Transactional
    public <T> List<T> queryForList(String sql, Object[] params, Class<T> objClass) {
        return jdbcTemplate.queryForList(sql, params, objClass);
    }

    /**
     * 查询单个值，如果返回多行或无数据返回，则使用默认值
     *
     * @param sql
     * @param params
     * @param objClass
     * @param <T>
     * @return
     */
    @Transactional
    public <T> T queryForObject(String sql, Object[] params, Class<T> objClass) {
        return jdbcTemplate.queryForObject(sql, params, objClass);
    }

    /**
     * 查询单个值，如果返回多行或无数据返回，则使用默认值
     *
     * @param sql
     * @param params
     * @param objClass
     * @param defaultValue
     * @param <T>
     * @return
     */
    @Transactional
    public <T> T scalar(String sql, Object[] params, Class<T> objClass, T defaultValue) {
        T obj;
        try {
            obj = jdbcTemplate.queryForObject(sql, params, objClass);
        } catch (IncorrectResultSizeDataAccessException e) {
            obj = defaultValue;
        }
        if (obj == null)
            obj = defaultValue;
        return obj;
    }
}
